// RAP [bm]: not needed without DnD support
///*******************************************************************************
// * Copyright (c) 2004, 2006 IBM Corporation and others.
// * All rights reserved. This program and the accompanying materials
// * are made available under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available at
// * http://www.eclipse.org/legal/epl-v10.html
// *
// * Contributors:
// *     IBM Corporation - initial API and implementation
// *******************************************************************************/
//package org.eclipse.ui.presentations;
//
//import org.eclipse.jface.util.Geometry;
//import org.eclipse.swt.SWT;
//import org.eclipse.swt.graphics.Point;
//import org.eclipse.swt.widgets.Control;
//import org.eclipse.swt.widgets.Event;
//import org.eclipse.swt.widgets.Listener;
//import org.eclipse.ui.internal.dnd.DragUtil;
//
///**
// * Contains various utility methods for Presentation authors
// * 
// * @since 3.0
// */
//public class PresentationUtil {
//    private static Point anchor;
//
//    private final static int HYSTERESIS = 16;
//    
//    private static int initialMouseButton = 0;
//
//    private final static String LISTENER_ID = PresentationUtil.class.getName()
//            + ".dragListener"; //$NON-NLS-1$
//
//    private static Event dragEvent;
//
//    private static Listener currentListener = null;
//
//    private static Control dragSource;
//
//    private static Listener dragListener = new Listener() {
//        public void handleEvent(Event event) {
//            dragEvent = event;
//            if (dragSource != event.widget) {
//                dragSource = null;
//                currentListener = null;
//            }
//        }
//    };
//
//    /**
//     * Returns whether the mouse has moved enough to warrant
//     * opening a tracker.
//     */
//    private static boolean hasMovedEnough(Event event) {
//        return Geometry.distanceSquared(DragUtil.getEventLoc(event), anchor) >= HYSTERESIS
//                * HYSTERESIS;
//    }
//
//    private static Listener moveListener = new Listener() {
//        public void handleEvent(Event event) {
//            handleMouseMove(event);
//        }
//    };
//
//    private static Listener clickListener = new Listener() {
//        public void handleEvent(Event e) {
//            handleMouseClick(e);
//        }
//    };
//
//    private static Listener mouseDownListener = new Listener() {
//        public void handleEvent(Event event) {
//            if (event.widget instanceof Control) {
//            	// Remember the button that started the drag so we
//            	// can forward it on the call to the 'externalDragListener'
//            	initialMouseButton = event.button;
//            	
//                dragSource = (Control) event.widget;
//                currentListener = (Listener) dragSource.getData(LISTENER_ID);
//                anchor = DragUtil.getEventLoc(event);
//
//                if (dragEvent != null && (dragEvent.widget != dragSource)) {
//                    dragEvent = null;
//                }
//            }
//        }
//    };
//
//    private static void handleMouseClick(Event event) {
//        cancelDrag();
//    }
//
//    private static void handleMouseMove(Event e) {
//        if (currentListener != null && dragEvent != null && hasMovedEnough(e)) {
//            if (dragSource != null && !dragSource.isDisposed()
//                    && dragSource == e.widget) {
//                Event de = dragEvent;
//                
//                // cache the current value so we can restore it later
//                int originalMouseButton = de.button;
//                
//                // Update the button field so that the drag listener
//                // can detect whether or not it's a 'right button' drag
//                de.button = initialMouseButton;
//                
//                Listener l = currentListener;
//                cancelDrag();
//                l.handleEvent(de);
//                
//                // Restore the event's state so that other listeners see 
//                // the original values
//                de.button = originalMouseButton;
//            } else {
//                cancelDrag();
//            }
//        }
//    }
//
//    private static void cancelDrag() {
//        currentListener = null;
//        dragEvent = null;
//        dragSource = null;
//
//        initialMouseButton = 0;
//    }
//
//    /**
//     * Adds a drag listener to the given control. The behavior is very similar
//     * to control.addListener(SWT.DragDetect, dragListener), however the listener
//     * attached by this method is less sensitive. The drag event is only fired
//     * once the user moves the cursor more than HYSTERESIS pixels. 
//     * <p>
//     * This is useful for registering a listener that will trigger an editor or
//     * view drag, since an overly sensitive drag listener can cause users to accidentally
//     * drag views when trying to select a tab.</p>
//     * <p>
//     * Currently, only one such drag listener can be registered at a time. </p> 
//     * 
//     * @param control the control containing the drag listener
//     * @param externalDragListener the drag listener to attach
//     */
//    public static void addDragListener(Control control,
//            Listener externalDragListener) {
//        control.addListener(SWT.DragDetect, dragListener);
//        control.addListener(SWT.MouseUp, clickListener);
//        control.addListener(SWT.MouseDoubleClick, clickListener);
//        control.addListener(SWT.MouseDown, mouseDownListener);
//        control.addListener(SWT.MouseMove, moveListener);
//        control.setData(LISTENER_ID, externalDragListener);
//    }
//
//    /**
//     * Removes a drag listener that was previously attached using addDragListener
//     * 
//     * @param control the control containing the drag listener
//     * @param externalDragListener the drag listener to remove
//     */
//    public static void removeDragListener(Control control,
//            Listener externalDragListener) {
//        control.removeListener(SWT.DragDetect, dragListener);
//        control.removeListener(SWT.MouseUp, clickListener);
//        control.removeListener(SWT.MouseDoubleClick, clickListener);
//        control.removeListener(SWT.MouseDown, mouseDownListener);
//        control.removeListener(SWT.MouseMove, moveListener);
//        control.setData(LISTENER_ID, null);
//        if (externalDragListener == currentListener) {
//            cancelDrag();
//        }
//    }
//
//}
